import 'package:flutter/services.dart';

/// 小数输入格式化器
/// 功能：
/// 1. 限制输入只能是数字和小数点
/// 2. 确保只能存在一个小数点
/// 3. 如果第一位是小数点，自动在前面添加"0"
/// 4. 支持设置小数位数限制
class DecimalInputFormatter extends TextInputFormatter {
  /// 小数位数限制，默认不限制
  final int? decimalPlaces;

  /// 是否允许负数，默认不允许
  final bool allowNegative;

  DecimalInputFormatter({
    this.decimalPlaces,
    this.allowNegative = false,
  });

  @override
  TextEditingValue formatEditUpdate(
    TextEditingValue oldValue,
    TextEditingValue newValue,
  ) {
    String newText = newValue.text;

    // 如果输入为空，直接返回
    if (newText.isEmpty) {
      return newValue;
    }

    // 移除所有非数字、非小数点、非负号的字符
    String filteredText = newText.replaceAll(RegExp(r'[^0-9.-]'), '');

    // 如果不允许负数，移除负号
    if (!allowNegative) {
      filteredText = filteredText.replaceAll('-', '');
    }

    // 处理负号位置（只能在开头）
    if (allowNegative && filteredText.contains('-')) {
      List<String> parts = filteredText.split('-');
      if (parts.length > 2) {
        // 多个负号，只保留第一个
        filteredText = '-${parts.skip(1).join('')}';
      } else if (!filteredText.startsWith('-')) {
        // 负号不在开头，移动到开头
        filteredText = '-${filteredText.replaceAll('-', '')}';
      }
    }

    // 处理小数点
    List<String> parts = filteredText.split('.');
    if (parts.length > 2) {
      // 多个小数点，只保留第一个
      filteredText = '${parts[0]}.${parts.skip(1).join('')}';
    }

    // 如果以小数点开头，添加前导零
    if (filteredText.startsWith('.')) {
      filteredText = '0$filteredText';
    } else if (filteredText.startsWith('-.')) {
      // 负数以小数点开头的情况
      filteredText = '-0${filteredText.substring(1)}';
    }

    // 处理小数位数限制
    if (decimalPlaces != null && filteredText.contains('.')) {
      List<String> decimalParts = filteredText.split('.');
      if (decimalParts.length == 2 && decimalParts[1].length > decimalPlaces!) {
        filteredText =
            '${decimalParts[0]}.${decimalParts[1].substring(0, decimalPlaces!)}';
      }
    }

    // 处理前导零（除了小数情况）
    if (filteredText.length > 1 &&
        filteredText.startsWith('0') &&
        !filteredText.startsWith('0.') &&
        filteredText != '0') {
      // 移除多余的前导零
      filteredText = filteredText.replaceFirst(RegExp(r'^0+'), '');
      if (filteredText.isEmpty || filteredText.startsWith('.')) {
        filteredText = '0$filteredText';
      }
    }

    // 处理负数的前导零
    if (allowNegative &&
        filteredText.startsWith('-0') &&
        filteredText.length > 2 &&
        !filteredText.startsWith('-0.')) {
      filteredText =
          '-${filteredText.substring(2).replaceFirst(RegExp(r'^0+'), '')}';
      if (filteredText == '-' || filteredText == '-.') {
        filteredText = '-0${filteredText.substring(1)}';
      }
    }

    // 如果文本没有变化，返回原值
    if (filteredText == newValue.text) {
      return newValue;
    }

    // 计算新的光标位置
    int newCursorPosition = newValue.selection.baseOffset;
    int lengthDifference = filteredText.length - newValue.text.length;
    newCursorPosition += lengthDifference;

    // 确保光标位置在有效范围内
    newCursorPosition = newCursorPosition.clamp(0, filteredText.length);

    return TextEditingValue(
      text: filteredText,
      selection: TextSelection.collapsed(offset: newCursorPosition),
    );
  }
}
